package appmodelo.modulo1.persistencia.ejb.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import appmodelo.modulo1.dominio.jpa.EntidadeJPA;
import appmodelo.modulo1.persistencia.ejb.Persistencia;
import appmodelo.modulo1.persistencia.ejb.exception.ConsultarExceptionPersistencia;
import appmodelo.modulo1.persistencia.ejb.exception.ExcluirExceptionPersistencia;
import appmodelo.modulo1.persistencia.ejb.exception.SalvarExceptionPersistencia;

public abstract class PersistenciaJpa<E extends EntidadeJPA> implements Persistencia<E> {

	@PersistenceContext
	protected EntityManager em;

	protected EntityManager getEntityManager() {
		return this.em;
	}
	
	protected abstract Class<E> getClasseEntidade ();
	
	public E salvar (E entidade) throws SalvarExceptionPersistencia {
		try {
			if (entidade.getId() == null) {
				em.persist(entidade);
				return entidade;
			} else {
				return em.merge(entidade);
			}
		} catch (Exception e) {
			throw new SalvarExceptionPersistencia(e);
		}
	}
	
	public E consultarPorId (Object idEntidade) throws ConsultarExceptionPersistencia {
		try {
			return em.find(getClasseEntidade(), idEntidade);
		} catch (Exception e) {
			throw new ConsultarExceptionPersistencia(e);
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<E> listar () throws ConsultarExceptionPersistencia {
		try {
			Query query = em.createQuery("SELECT e FROM " + getClasseEntidade().getName() + " e");
			return query.getResultList();
		} catch (Exception e) {
			throw new ConsultarExceptionPersistencia(e);
		}
	}
	
	public void excluir (Object idEntidade) throws ExcluirExceptionPersistencia {
		try {
			E entidade = consultarPorId (idEntidade);
			em.remove(entidade);
		} catch (Exception e) {
			throw new ExcluirExceptionPersistencia(e);
		}
	}
}